package com.ftg.mall.base.util.bussiness;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;

import java.util.List;
import java.util.Map;

/**
 * 通用sql，为了解决sql单独执行问题
 * @param <T> 用于返回信息的vo,多表的映射
 * @author kangjx
 * @date 2022/10/27
 */
@Mapper
public interface MapperUtil<T> {

    /**
     * 通用sql语句处理分页功能，针对复杂语句的特殊化处理
     * @param start 开始位置
     * @param limit 显示条目
     * @param sql 语句
     * @return List<Map<String,Object>>
     */
    @SelectProvider(type = MapperUtilSql.class,method = "pageUtilSql")
    List<Map<String,Object>> pageUtil(@Param("start") int start,@Param("limit") int limit,@Param("sql")String sql);

    /**
     * 针对于sql语句进行统计操作，用于生成分页的全部数据量
     * @param sql 语句
     * @return  数量 int
     */
    @SelectProvider(type = MapperUtilSql.class,method = "countUtil")
    int countUtil(@Param("sql")String sql);

    /**
     * 返回自己定义实体类| 暂时没有找到对应的方法,解决 mapper加载问题
     * @param start 开始位置
     * @param limit 显示条目
     * @param sql 语句
     * @return List<T>
     */
    @SelectProvider(type = MapperUtilSql.class,method = "pageUtilSql")
    List<T> pageUtilForT(@Param("start") int start, @Param("limit") int limit, @Param("sql")String sql);

    /**
     * 不事分页的查询 功能封装
     * @param sql 语句
     * @return List<Map<String,Object>>
     */
    @SelectProvider(type = MapperUtilSql.class,method = "utilSelect")
    List<Map<String,Object>> utilSelect(@Param("sql")String sql);

}
